

template <typename T>
void Show_Array(T data[], const int size, const int col)
//Відображення елементів масиву по n колонок
{
	for (int i = 0; i< size; i++)
	{
		if (!(i%col)) cout << "\n";
		cout << "\t" << data[i];
	}
}

template <typename T>
int Binary_Search (const T *data, const T value, size_t left, size_t right)
//Бінарний пошук у відсортованиму масиві без рекурсії (лекційний матеріал)
// O(log(2)n = O(4)  2^4 = 16
{
	size_t ind = left + (right - left)/2;
	while (left < right)
	{
		if (value <= *(data+ind))
		{
			right = ind;
		}
		else 
		{
			left = ind+1;
		}
		ind = left + (right - left)/2;
	}
	if (value == *(data+ind))
	{
		return ind;
	}
	return -1;
}

template <typename T>
int Find_Cell (T cell, T *arr, int start, int size)
//Функція пошуку елемента у масиві та повернення
//індексу першого знайденого елементу. Якщо не знайдено то -1
{
	//if (size==0) size = sizeof(arr)/sizeof(*arr);
	for (int i= start; i< size; i++)
	{
		if (cell == *(arr+i)) return i;
	}
	return -1;
}


template <typename T>
int BinarySearch (const T data[], int left, int right, const T value)
//Бінарний пошук з використанням рекурсії (лекційний матеріал)
//Масив повинен бути відсортований
// O(log(2)n = O(4)  2^4 = 16
{
	if (left > right)
	{
		return -1;
	}
	const int ind = left + (right - left)/2;
	if (value == data[ind])
	{
		return ind;
	}
	if (value < data[ind])
	{
		return BinarySearch(data, left, ind-1, value);
	}
	return BinarySearch(data, ind+1, right, value);

}

template <typename T>
int Linear_Search (const T data[], const int size, const T value)
//Лінійний пошук по масиву O(n)
{
	for (int i= 0; i< size; i++)
	{
		if (data[i] == value)
		{
			return i;
		}
	}
	return -1;
}

template <typename T, typename P>
void Show_Struct(T *data, P *count_A, P *count_B, const size_t size, const int col)
//Відображення елементів 3-х масивів у 3 стрічки по n колонок
{
int *parr=NULL;
for (size_t row = 0; row< size; row+=col)
{	
	for (int n= 0; n< 3; n++)
	{
		cout << "\n";
		switch (n)
		{
		case 0:
			parr = data;
			//cout << *(str+n) << (row/col)+1 << "\t";
			cout << "Row " << (row/col)+1 << "\t";
			break;
	
		case 1:
			parr = count_A;
			//cout << *(str+n);
			cout << "Count in A[]:";
			break;
		
		case 2:
			parr = count_B;
			//cout << *(str+n);
			cout << "Count in B[]:";
			break;
		}
		
		for (size_t i = row; (i<size); i++)
		{
			cout << "\t";
			if (n==0) cout << "[";
			cout << *(parr+i);
			if (n==0) cout << "]";
			
			if ((i+1)%col==0) break;
		}
		if (n==0) Line (9*(col+1), '_');
	}
	Line(9*(col+1), '-');
	cout << "\n";
}
}

template <typename T>
void Finde_Minus(T *data, size_t size, int &l_minus, int &r_minus)
//фукція знаходження крайніх від"ємних чивел масиву
//у функцію передаються посилання на змінні для збереження індексів крайнії елементів
{
	l_minus= -1;
	r_minus= -1;
	
	size_t i= 0;
	for ( ; (i< size); i++)
	{
		if (*(data+i)< 0)
		{
			l_minus = i;
			break;
		}
	}
	if (l_minus < 0) return;
	
	for (size_t j= size-1; j>= i; j--)
	{
		if (*(data+j)< 0)
		{
			r_minus = j;
			break;
		}
	}
}

template <typename T>
T Max_Array (T *data, size_t size)
{
	T max_num=*data;
	for (size_t i= 1; i< size; i++)
	{
		if (max_num < *(data+i) ) max_num = *(data+i);
	}
	return max_num;
}

template <typename T>
T Min_Array (T *data, size_t size)
{
	T min_num=*data;
	for (size_t i= 1; i< size; i++)
	{
		if (min_num > *(data+i) ) min_num = *(data+i);
	}
	return min_num;
}

